﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CmdHelp
{


    /// <summary>
    /// 外部写日志调用方法
    /// </summary>
    public class CmdLogWriteHelper
    {

        /// <summary>
        /// 外部访问的实体
        /// </summary>
        private static readonly CmdLogWriteHelper instance = new CmdLogWriteHelper();

        /// <summary>
        /// 注册
        /// </summary>
        /// <param name="write">写入write</param>
        public void Regist(ICmdLogWrite write)
        {
            Writer = write;
        }

        public ICmdLogWrite Writer { get; protected set; }
        /// <summary>
        /// 外部访问的实体
        /// </summary>
        public static CmdLogWriteHelper Instance
        {
            get
            {
                return instance;
            }
        }
    }

    /// <summary>
    ///命令日志帮肋类
    /// </summary>
    public interface ICmdLogWrite
    {

        /// <summary>
        /// 写入发送日志(向终端发送命令)
        /// logent 实体的ext中必须包括 
        /// key 模块名称, 命令类型
        /// </summary>
        /// <param name="logent">终端日志实体</param>
        /// <param name="incomSendDataHex">inCOM->终端时使用此参数</param>
        /// 
        void WriteSendRecord(cmdlogEntity logent, string incomSendDataHex = null);
        //        {
        //            //将日志记录写入数据库
        //            //必须包含 模块名称
        //            //发送时间
        //            //命令类型;如参数查询,参数设置,远程控制,等

        //            string sql = @"

        //INSERT INTO INCOM_CMDLLG ( 
        //TERMINALCODE ,
        //VIN ,
        //SENDTIME ,
        //MODULENAME ,
        //TOKEN ,
        //SENDCONTENT ,
        //        --RESPONSETIME ,
        //        --RESPONSECONTENT ,
        //        --TIMEOUT ,
        //        --TERMINALHEX ,
        //        --REMARK ,
        //        --REMARK1 ,
        //SENDHEX ,
        //CMDTYPE ) 

        //VALUES (
        //TERMINALCODE,
        //'VIN',
        //SENDTIME,
        //'MODULENAME',
        //'TOKEN',
        //'SENDCONTENT',
        //        --RESPONSETIME,
        //        --'RESPONSECONTENT',
        //        --TIMEOUT,
        //        --'TERMINALHEX',
        //        --'REMARK',
        //        --'REMARK1',
        //'SENDHEX',
        //'CMDTYPE'
        //)
        //";






        //}

        /// <summary>
        /// 写入回应日志(接收终端的应答及回传)
        /// </summary>
        /// <param name="logent"></param>
        /// <param name="update">默认为使用 token+模块名+终端号做为主键进行更新</param>
        /// <param name="terminalResponseDataHex">终端->inCOM接收到数据后使用此参数</param>
        void WriteReceiveLog(cmdlogEntity logent, bool update = true, string terminalResponseDataHex = null);
        //        {
        //            //将日志记录写入数据库
        //            if (update)
        //            {
        //                #region 只做update操作

        //                #endregion
        //            }
        //            else
        //            {
        //                #region 插入操作只插入应答部分
        //                string sql = @"

        //INSERT INTO INCOM_CMDLLG ( 
        //TERMINALCODE ,
        //VIN ,
        //--SENDTIME ,
        //MODULENAME ,
        //TOKEN ,
        //--SENDCONTENT ,
        //RESPONSETIME ,
        //RESPONSECONTENT ,
        //        --TIMEOUT ,
        //TERMINALHEX ,
        //        --REMARK ,
        //        --REMARK1 ,
        //--SENDHEX ,
        //CMDTYPE ) 

        //VALUES (
        //TERMINALCODE,
        //'VIN',
        //--SENDTIME,
        //'MODULENAME',
        //'TOKEN',
        //--'SENDCONTENT',
        //     RESPONSETIME,
        //     'RESPONSECONTENT',
        //        --TIMEOUT,
        //     'TERMINALHEX',
        //        --'REMARK',
        //        --'REMARK1',
        //--'SENDHEX',
        //'CMDTYPE'
        //)
        //";
        //                #endregion
        //            }
        //}

    }
    /// <summary>
    /// 命令记录实体
    /// </summary>
    public class cmdlogEntity
    {
        /// <summary>
        /// 一包命令的ID
        /// </summary>
        public string ToKen { get; set; }


        /// <summary>
        /// 终端号
        /// </summary>
        public long TerminalCode { get; set; }

        /// <summary>
        /// VIN 如果有则需要填写
        /// </summary>
        public string Vin { get; set; }


        /// <summary>
        /// 模块名节点,按项目来,如DGS1,RC1,WEB1 
        /// </summary>
        public string ModuleName { get; set; }

        /// <summary> 
        /// 扩展信息 明细示例如下:
        /// 终端号
        ///Vin
        ///接收数据时间
        ///接收数据内容
        ///发送数据时间
        ///发送数据内容
        ///模块名
        ///RC1.接收数据时间
        ///RC1.判断是否在丢弃
        ///RC1.转换时间
        ///RC1.处理时间
        ///RC1.发送内容(json/hex)
        ///RC1.发送时间
        /// </summary>
        public Dictionary<string, string> EXT { get; set; }

    }
}
